package com.ib.review.config.oauth;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author ldw
 * 2024/01/25 15:58
 */
@Configuration
@Slf4j
public class SaTokenConfigure {
    @Bean
    public SaServletFilter getSaServletFilter() {
        return new SaServletFilter()
                // 指定 拦截路由 与 放行路由
                .addInclude("/**").addExclude("/userLogin/*", "/favicon.ico", "/decrypt/decryptParam",
                        "/review/external/*")
                // 在每次认证函数之前执行
                .setBeforeAuth(obj -> {
                    // 从 header 中获取自定义 token
                    String authorization = SaHolder.getRequest().getHeader("Authorizationtoken");
                    // 如果存在，手动设置 Token 值，覆盖默认逻辑
                    if (authorization != null && authorization.startsWith("biToken=")) {
                        String token = authorization.substring("biToken=".length());
                        StpUtil.setTokenValue(token);
                    }
                })
                // 认证函数: 每次请求执行
                .setAuth(obj -> {
                    // 登录认证 -- 拦截所有路由，并排除/user/doLogin 用于开放登录
                    SaRouter.match("/**", "/userLogin/*", StpUtil::checkLogin);
                })
                // 异常处理函数：每次认证函数发生异常时执行此函数
                .setError(e -> {
                    log.warn("路由过滤e:{}", e.getMessage());
                    return new SaResult(401, "用户未登录或已失效", null);
                });
    }
}
